package com.sistemagestion.ventas.view;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.sistemagestion.R;
import com.sistemagestion.BO.ClienteBO;
import com.sistemagestion.BO.FacturaBO;
import com.sistemagestion.BO.FormaPagoBO;
import com.sistemagestion.BO.ProductoBO;
import com.sistemagestion.Entities.Cliente;
import com.sistemagestion.Entities.DetalleFactura;
import com.sistemagestion.Entities.Factura;
import com.sistemagestion.Entities.FormaPago;
import com.sistemagestion.Entities.Producto;
import com.sistemagestion.Utils.Constantes;
import com.sistemagestion.Utils.Constantes.Operations;
import com.sistemagestion.productos.view.ProductoAutoCompleteAdapter;

public class FacturaEdit extends Activity {

	FacturaBO facturabo = new FacturaBO();
	ClienteBO clientebo = new ClienteBO();

	TextView txtCliente;
	TextView txtNroFactura;
	EditText txtCantidad;
	AutoCompleteTextView txtProducto;
	Button btnAgregrar;
	ListView lstItems;
	Button btnGuardar;
	TextView txtTotal;
	Button btnCancelar;

	Spinner spnFormaPago;

	List<FormaPago> listaFormaPago;
	FormaPagoBO formapagobo;

	List<Producto> listaProductos;
	ProductoBO productobo;

	List<DetalleFactura> listaDetalleFactura = new ArrayList<DetalleFactura>();
	Factura factura;
	
	Cliente cliente;

	Constantes.Operations operacion = Constantes.Operations.ADD;

	Cliente _cliente;
	Producto _selectedProduct;
	Float SubTotal = (float)0;
	FacturaItemAdapter adapter; 
	ProductoAutoCompleteAdapter adapterTxtProd;
	
	int selectedPos;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lyt_factura_edit);
		Bundle b = getIntent().getExtras();
		operacion = (Constantes.Operations) b.getSerializable("OPERATION");
		_cliente = (Cliente) b.getSerializable("CLIENTE");
		InitVars();
		InitView();
		registerForContextMenu(lstItems);
		if (operacion == Constantes.Operations.EDIT)
			MostrarRegistro();
	}
	
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		
		super.onCreateContextMenu(menu, v, menuInfo);
		MenuInflater inflater = getMenuInflater();
		menu.setHeaderTitle("Opciones");
		inflater.inflate(R.menu.ctx_mn_lstitemsfactura, menu);
	}
	@Override
	public boolean onContextItemSelected(MenuItem item) {

		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
				.getMenuInfo();
		selectedPos = info.position;
		
		switch (item.getItemId()) {
			case R.id.itmEliminar:
				removeItem(listaDetalleFactura.get(selectedPos));
				break;
			default:
				return true;
				
		}
		return true;
	}

	private void InitView() {
		txtCliente = (TextView) findViewById(R.id.txtCliente);
		txtNroFactura = (TextView) findViewById(R.id.txtNroFactura);
		spnFormaPago = (Spinner) findViewById(R.id.spnFormaPago);
		txtProducto = (AutoCompleteTextView) findViewById(R.id.txtProducto);
		btnAgregrar = (Button) findViewById(R.id.btnAgregar);
		lstItems = (ListView)findViewById(R.id.lstItems);
		txtCantidad = (EditText) findViewById(R.id.txtCantidad);
		txtTotal = (TextView) findViewById(R.id.txtTotal);
		btnAgregrar.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				addItem();
			}
		});
		
		txtProducto.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int pos,
					long id) {
				_selectedProduct = adapterTxtProd.getItem(pos);	
			}
		});

		btnGuardar = (Button) findViewById(R.id.btnGuardar);
		btnGuardar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				Guardar();
				
			}
		});
		
		btnCancelar = (Button)findViewById(R.id.btnCancelar);
		btnCancelar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				finish();
				
			}
		});
		
		txtProducto.addTextChangedListener(new TextWatcher() {
			
			@Override
			public void onTextChanged(CharSequence text, int arg1, int arg2, int arg3) {
				adapterTxtProd.getFilter().filter(text);
			}
			
			@Override
			public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
					int arg3) {
				// TODO Auto-generated method stub
			}
			
			@Override
			public void afterTextChanged(Editable arg0) {
				// TODO Auto-generated method stub
				
			}
		});
		
		FillSpnFormaPago();
		InitTxtProducto();
		FillLstItems();
		if (_cliente != null)
			txtCliente.setText(_cliente.getNombreApellido());
		txtNroFactura
			.setText(Integer.toString((facturabo.getProxNumeroFactura())));
	}

	private void addItem()
	{
		if (_selectedProduct == null)
		{
			Toast.makeText(this, "Seleccione Producto", Toast.LENGTH_SHORT).show();
			return;
		}
		if (txtCantidad.getText().length() == 0)
		{
			Toast.makeText(this, "Ingrese la cantidad", Toast.LENGTH_SHORT).show();
			return;
		}
		if (_selectedProduct.getStock() < Float.parseFloat((txtCantidad.getText().toString())))
		{
			Toast.makeText(this, "Stock insuficiente", Toast.LENGTH_SHORT).show();
			return;
		}
		
		DetalleFactura detalle = ObtenerDetalleFacturaLista();
		if(detalle == null)
		{
			detalle = new DetalleFactura();
			listaDetalleFactura.add(detalle);
		}
		
		detalle.setCantidad((Integer.parseInt((txtCantidad.getText().toString()))) + detalle.getCantidad());
		detalle.setIdProducto(_selectedProduct.getIdProducto());
		SubTotal +=(((float)detalle.getCantidad()) * _selectedProduct.getPrecioVenta());
		detalle.setSubTotal(SubTotal);
		detalle.setPrecio(_selectedProduct.getPrecioVenta());
		FillLstItems();
		txtTotal.setText("Total: $ ".concat(Float.toString(CalcularTotal())));
		
		txtProducto.setText("");
		txtCantidad.setText("");
		
	}
	
	private void removeItem(DetalleFactura detalle)
	{
		listaDetalleFactura.remove(detalle);
		FillLstItems();
		SubTotal -=(((float)detalle.getCantidad()) * _selectedProduct.getPrecioVenta());
		detalle.setSubTotal(SubTotal);
		txtTotal.setText("Total: $ ".concat(Float.toString(CalcularTotal())));
	}
	
	private DetalleFactura ObtenerDetalleFacturaLista(){
		if (_selectedProduct != null && listaDetalleFactura != null){
			for (DetalleFactura item : listaDetalleFactura) {
				if (item.getIdProducto() == _selectedProduct.getIdProducto())
					return item;
			}
		}
		return null;
	}
	
	private void InitVars() {
		formapagobo = new FormaPagoBO();
		listaFormaPago = formapagobo.getAll();

		productobo = new ProductoBO();
		listaProductos = productobo.getAll();
	
	}
	
	private void Guardar()
	{
		FormaPago formaPago = (FormaPago)spnFormaPago.getSelectedItem();
		if (operacion == Operations.ADD)
			factura = new Factura();
		factura.setNumeroFactura(facturabo.getProxNumeroFactura());
		factura.setPrefijoFactura(1);
		factura.setIdCliente(_cliente.getIdCliente());
		factura.setTotal(CalcularTotal());
		factura.setFormaPago(formaPago.getIdFormaPago());
		facturabo.saveFacturaDatelle(factura, listaDetalleFactura);
		finish();
	}

	private Float CalcularTotal()
	{
		Float total = (float)0;
		if ((listaDetalleFactura != null) && (listaDetalleFactura.size() > 0))
		{
			for (DetalleFactura item : listaDetalleFactura) {
				total += item.getSubTotal();
			}
		}
		return total;
	}
	
	private void MostrarRegistro() {
//		cliente = clientebo.getById(_factura.getIdCliente());
//		txtCliente.setText(cliente.getNombreApellido());
//		txtNroFactura.setText(_factura.getNumeroFactura());
//		txtProducto.setText(_factura.get)
//		btnAgregrar = (Button) findViewById(R.id.btnAgregar);
//		lstItems = (ListView)findViewById(R.id.lstItems);
//		txtCantidad = (EditText) findViewById(R.id.txtCantidad);
//		txtTotal = (TextView) findViewById(R.id.txtTotal);
//		spnFormaPago = (Spinner) findViewById(R.id.spnFormaPago);
	}

	private void FillSpnFormaPago() {
		ArrayAdapter<FormaPago> adapter = new ArrayAdapter<FormaPago>(this,
				android.R.layout.simple_gallery_item, listaFormaPago);

		spnFormaPago.setAdapter(adapter);
	}
	private void InitTxtProducto() {
		
		adapterTxtProd = new ProductoAutoCompleteAdapter(this, android.R.layout.simple_list_item_1, listaProductos);
		txtProducto.setAdapter(adapterTxtProd);
	}
	private void FillLstItems()
	{
		adapter = new FacturaItemAdapter(this, R.layout.lyt_factura_item, listaDetalleFactura);
		lstItems.setAdapter(adapter);	
	}
	
}
